package com.wang.learn.cloudrabbitmq.config;

import com.wang.learn.cloudrabbitmq.enums.QueueEnum;
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 消息队列相关配置
 *
 * @author macro
 * @date 2018/9/14
 */
@Configuration
public class RabbitMqConfig {

    /**
     * 交换机类型定义
     * fanout：Fanout-Exchange会将它接收到的消息发往所有与他绑定的Queue中。
     * direct：Direct-Exchange会把它接收到的消息发往与它有绑定关系且Routingkey完全匹配的Queue中（默认）。
     * topic：Topic-Exchange与Direct-Exchange相似，不过Topic-Exchange不需要全匹配，可以部分匹配，它约定：Routingkey为一个句点号“. ”分隔的字符串（我们将被句点号“. ”分隔开的每一段独立的字符串称为一个单词）。
     * header：Header-Exchange不依赖于RoutingKey或绑定关系来分发消息，而是根据发送的消息内容中的headers属性进行匹配。此模式已经不再使用，本文中也不会去讲，大家知道即可。
     */

    /**
     * 订单消息实际消费队列所绑定的交换机
     */
    @Bean
    DirectExchange orderDirect() {
        return (DirectExchange) ExchangeBuilder
                .directExchange(QueueEnum.QUEUE_ORDER_CANCEL.getExchange())
                .durable(true)
                .build();
    }

    /**
     * 订单实际消费队列
     */
    @Bean
    public Queue orderQueue() {
        return new Queue(QueueEnum.QUEUE_ORDER_CANCEL.getName());
    }


    /**
     * 将订单队列绑定到交换机
     */
    @Bean
    Binding orderBinding(DirectExchange orderDirect, Queue orderQueue){
        return BindingBuilder
                .bind(orderQueue)
                .to(orderDirect)
                .with(QueueEnum.QUEUE_ORDER_CANCEL.getRouteKey());
    }


    /** topic test **/


    /**
     * 订单消息实际消费队列所绑定的交换机
     */
    @Bean
    TopicExchange orderTopicExchange() {
        return (TopicExchange) ExchangeBuilder
                .topicExchange("topic")
                .durable(true)
                .build();
    }

    /**
     * 订单实际消费队列
     */
    @Bean
    public Queue orderQueue1() {
        return new Queue("queue1");
    }

    /**
     * 订单实际消费队列
     */
    @Bean
    public Queue orderQueue2() {
        return new Queue("queue2");
    }

    /**
     * 将订单队列绑定到交换机
     * 单个单词匹配
     */
    @Bean
    Binding orderTopicBinding1(){
        return BindingBuilder
                .bind(orderQueue1())
                .to(orderTopicExchange())
                .with("sms.*");
    }

    /**
     * 将订单队列绑定到交换机
     * 多个单词模糊匹配
     */
    @Bean
    Binding orderTopicBinding2(){
        return BindingBuilder
                .bind(orderQueue2())
                .to(orderTopicExchange())
                .with("mail.#");
    }



}
